문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 RAM/주소할당 문제 (문단 편집) === 640 KiB 문제 === * 해당 운영 체제: [[MS-DOS]] 및 그 호환 운영 체제 일명 '''기본 메모리 문제'''라고 하며 아마도 [[MS-DOS]] 시기를 거친 올드 컴덕들에게는 가장 유명한 메모리 문제이자 가장 많은 사람들을 괴롭힌 문제일 것이다. '640 KiB면 모든 사람에게 충분한 메모리 용량이다.'라는 [[빌 게이츠]]의 발언 하나가 이 문제의 원흉이 됐다는 소문도 돌 정도였으나 실제로 빌 게이츠는 그런 소리를 한 적이 없다. 진짜 이유는 따로 있으니... [[MS-DOS]]의 기본 메모리(Conventional Memory)와 그에 관련된 IBM PC 메모리 맵 체계가 프로그램이 사용하는 메모리 영역이 640 KiB로 제한되어 있어서 발생하는 문제이다. IBM이 IBM PC 설계를 할때 비디오 버퍼와 BASIC ROM 등의 펌웨어의 주소 할당에 대한 논의를 운영 체제를 공급하는 마이크로소프트와 협의를 했는데, 641 KiB부터 1024 KiB까지 할당하고 IBM PC 프로그램이 사용하는 메모리 영역을 최대 640 KiB까지 확장(업그레이드)을 할 수 있도록 한것이 화근이었다. 사실 유저 영역은 0번지부터, 시스템 영역은 마지막 번지부터 중앙으로 먹어 들어오는 것이 상식적이고 확장성이 있으나, 당시에는 이럴 수밖에 없는 현실적 이유가 있었다. PC의 초창기인 8비트 시절에는 서로 다른 회사에서 만든 개인용 컴퓨터들이 수십 종 이상 난립하고 있었기 때문에 소프트웨어가 서로 호환되지 않았다. 하지만 다른 아키텍처의 PC임에도 8비트 CPU는 [[인텔 8080]], [[Z80]], 모토로라 6800, [[모스 테크놀로지 6502]] 등으로 몇 종류 되지 않았던 덕에 CPU는 서로 비슷했다.[* 일본은 거의 대부분의 8비트 PC가 Z80을 채용하고 있었지만 파편화는 미국보다 몇 배 더 심각했다.] 이런 경우 프로그램 메모리 영역은 0번지부터 출발하게 하고 기종마다 서로 다른 ROM, I/O 등의 메모리 영역을 특정 번지에 위치시키면, 프로그래머 입장에서 기반이 되는 프로그램은 똑같이 만들어 코드 재사용성이 높아지고, 개별 기종에 따른 I/O 포트 제어 등만 기종별로 만들면 되니 CPU는 같지만 아키텍처가 다른 많은 컴퓨터에 대한 소프트웨어 개발이 편해진다. IBM PC 또한 이런 당대의 유행을 따른 것이었다.[* 근본적 원인은 아니다. 프로그램 메모리 영역이 어디냐의 문제는 부차적인 것이기 때문.] 현실은 때때로 엔지니어의 예측을 아득히 뛰어넘어 엔지니어가 [[공밀레]] 하게끔 만든다. [[파일:pc-xt-memory-map-n.jpg]] 사실 근본적인 문제는 [[IBM PC]] 및 [[IBM PC XT]]에서 이용된 [[인텔]] [[8088]] [[CPU]] 아키텍쳐의 문제다. 이 CPU는 내부적으로 주소에 20비트를 이용했으므로 주소 지정을 2^^20^^=1 MiB까지만 할 수 있었다. 이에 맞춰 MS-DOS가 사용자 영역으로 640 KiB, 하드웨어 영역인 UMB(Upper Memory Block)를 384 KiB를 할당하면서 이런 문제가 발생한다.[* 그렇기 때문에 설령 하드웨어 영역을 최소화한다고 해도 둘 합해서 1 MiB라는 것 자체는 변하지 않아서 640KiB에 비해 고작 20~30% 정도 늘어날 뿐이다.] 물론 [[IBM PC AT]]에서 채용된 [[80286]] CPU는 주소를 최대 16 MiB(24비트)까지 이용할 수 있었고 [[80386]] 이후의 [[32비트]] CPU에서는 4 GiB(32비트)까지 늘어났지만 [[MS-DOS]]에서는 그런 거 상관없이 CPU를 뭘 쓰든지 여전히 640 KiB만 이용할 수 있었다. 후술할 4 GiB 문제에서 32비트 운영 체제에서는 램 8 GiB, 16 GiB를 달아도 4 GiB밖에 인식이 안 되고 그 중 몇백 MiB를 못 쓰는 것처럼([[램 디스크]]를 써서 이용하는 방법 제외) 장착된 램이 16 MiB라도 기본적으로 640 KiB를 넘는 메모리는 못 썼다. 왜 하드웨어가 발전했음에도 불구하고 이렇느냐 하면, MS-DOS는 기본적으로 x86의 실제 모드(Real mode)에서 동작하기 때문이다. x86 CPU의 실제 모드는 하위 호환성을 위해서 8086과 동일하게 동작하는 모드로 8086과 마찬가지로 20비트 주소 지정을 하므로 메모리는 1 MiB까지만 접근할 수 있다. 1 MiB보다 상위의 메모리 영역에 접근하기 위해서는 보호 모드(Protected mode)로 동작해야 하는데 MS-DOS에서는 보호 모드를 지원하지 않았다. Himem.sys와 EMM386/QEMM386 등의 메모리 관리자를 사용하면 보호 모드로 전환해 640 KiB보다 상위에 있는 메모리를 사용할 수는 있었으나, CPU에서 실행되는 코드처럼 프로그램의 중요한 부분은 640 KiB 영역에 두고 용량 많이 먹는 데이터 쪽을 EMS/XMS 영역으로 넘긴다는 개념이었다. 원래 EMS(Expanded Memory Specification/중첩 확장 메모리)는 [[IBM PC AT]]가 등장한 1984년에 대용량의 메모리를 필요로 하는 기업 사용자를 위해 만들어진 규격인데, 당시에는 메모리 집적도가 낮았으므로 커다란 확장 카드에 메모리를 다닥다닥 붙여서 ISA 슬롯에 장착해서 쓰는 물건이었다. [[https://en.wikipedia.org/wiki/Expanded_memory#/media/File:EmulexPersyst_4M_ISA.jpeg|이렇게 생겼다.]] EMS가 필요한 소프트웨어, 예를 들어 게임의 경우 1990년대 초반([[심시티 클래식|심시티]][* 1993년에 나온 리메이크 버전 한정. 1989년에 나온 초기판은 기본 메모리로도 잘 돌아간다.], [[윙커맨더 1|윙 커맨더]], [[윙커맨더 2|윙 커맨더 2: 킬라시의 복수]], 스타워즈: 엑스 윙 등) MS-DOS 게임이나 일본 DOS/V 게임을 구동할 때, EMM386은 XMS(Extended Memory Specification/연속 확장 메모리) 영역의 일부를 EMS 영역처럼 에뮬레이션하여 구동하는 것이다. 기본 메모리에 이것저것 올리다 보면 남은 용량이 점점 사라지는데, 이런 상태에서 기본 메모리를 많이 소모하는 프로그램을 돌리려 하면 메모리가 부족하다는 메시지를 뱉으면서 실패할 수도 있다. 따라서 아무리 장착된 메모리에 여유가 있더라도 결국 원활한 프로그램 실행을 위해서는 이 하위 640 KiB 영역을 확보하기 위해 사활을 걸어야 했다. [[MS-DOS]] 후반기인 1990년대 중반 무렵에 나온 게임은 기본 메모리를 특히 많이 써서, 피나는 노력을 들여 실행하기 전에 570~610 KiB의 메모리를 확보해 두어야 했다. 예를 들면 마우스나 CD-ROM 드라이버 등 백그라운드에서 실행되는 메모리 상주 프로그램은 상시 동작하고 있기 때문에 기본 메모리에 올라가 있어야 한다. 장치 드라이버는 config.sys에서 DEVICEHIGH 명령어를 통해 하드웨어를 위해 예약된 공간인 UMB로 올릴 수 있었지만, 메모리 상주 프로그램은 이것이 불가능했다. 이런 것이 하나에 많으면 30 ~ 150 KiB 정도 차지하므로 메모리 상주 프로그램을 최대한 줄여서 기본 메모리를 확보해 줘야 했다. CD-ROM 드라이버 같은 드라이버도 사용하지 않을 때는 제거하는 등 필사적인 노력을 했지만 다행히 MS-DOS 6.0 이후에는 DEVICEHIGH나 LOADHIGH 또는 INSTALLHIGH 명령어를 이용해 UMB에 올릴 수 있게 됐다. 당대에 보편적으로 쓰였던 셸 프로그램인 [[Mdir]]은 이런 상황을 반영하여 다른 파일 실행 시 자신을 종료하여 메모리를 반환받은 후 파일을 실행하고 실행 파일을 종료하면 다시 복귀하는 일괄 실행 파일을 만드는 기능이 있었을 정도. 이런 사용자들의 피나는 투쟁을 지원하기 위해 상주 프로그램들을 XMS/UMB로 넘겨서 610 KiB 이상으로 만들어주는 QEMM386이라는 메모리 관리 프로그램이 선풍적인 인기를 끌었으나 [[어스토니시아 스토리]], [[신검의 전설]] 2 같은 몇몇 게임과의 충돌 문제가 있었으며, 삼성 등의 메이커 PC는 기본 세팅에서 이미 UMB의 일부 영역을 사용 중인 경우가 있었다. 결국 Microsoft도 MS-DOS 6.0부터 QEMM386만큼은 못하지만 자체적으로 640 KiB 영역을 튜닝해 주는 Memmaker.exe를 지원하기에 이른다. 하지만 6.0은 멀티 부팅할 수 있었지만 Memmaker가 멀티 부팅을 인식하지 못한다는 문제가 있었고, 6.22에서 해당 문제가 수정되었다. 기본 메모리를 어떻게 확보한 다음 UMB 영역과 XMS 영역을 사용한다 하더라도 문제가 또 있었는데 프로그램마다 요구하는 메모리 영역이 달랐던 것이다. 어떤 프로그램은 XMS를 요구하기도 하고, 또 어떤 프로그램은 EMS를 요구하기도 하는 식의 제각각이었다. || [youtube(XAyQLV5bbb0)] || || What is DOS Protected Mode? / 유튜브 Nostalgia Nerd - 도스 보호 모드에 관한 설명 영상. || 후기에는 대체로 XMS를 많이 사용했는데, DOS4GW 모듈이 대표적이었다. DOS4GW는 보호 모드를 활용해 XMS 메모리 영역에 접근할 수 있게 해 주는 DOS 익스텐더 런타임 환경이다. 대표적으로 1990년대 중반에 발매된 어지간한 북미산 DOS 게임(대표적으로 [[둠]])[* 위의 영상에서 예시로 든 게임은 [[라이즈 오브 더 트라이어드]].]들은 이 런타임 환경을 기본으로 사용했다. 게임뿐 아니라 일반적인 소프트웨어도 마찬가지로 도스에서 실행되던 초기의 [[아래아 한글]]도 해당 런타임을 경유해 실행되었다. 게임 개발사들은 이것을 이용해 편리하게 메모리를 관리할 수 있었다. 반면 [[PC-9801]]에서 이식한 [[DOS/V]] 게임들은 PC-9801이 확장성이 떨어져 주로 메모리 확장을 C버스용 EMS 메모리 보드로 했던 탓에 대부분 EMS를 사용했다.[* 한국 게임인 [[일루전 블레이즈]]는 EMS가 모자라면 기본 4개 스테이지가 자동으로 스킵되어 후반 스테이지로 넘어가는 문제가 있었다.] 상황이 이 모양이다 보니 그때 그때마다 메모리 설정을 바꾸고 리부팅을 해야 하는 귀찮음을 감수해야 하는 경우도 드물지 않았다. 용도에 따라서 부팅 디스켓을 따로 만들어서 그나마 귀찮음을 줄일 수 있었다. CD롬 드라이버 유무, 마우스 유무 등에 따라 부팅 디스켓을 따로 준비해 두고 각 게임이 원하는 세팅으로 나눠두는 것. 당시에는 게임에 따라 정확히 세팅을 하는 것이 쾌적한 게임을 위한 최소한의 준비였다.[* 그 유명한 [[듀크 뉴켐 3D]] 또한 이렇다. 아니, 1990년대 중반 이후 발매된 좀 유명한 MS-DOS용 게임들은 대부분 이렇다고 보면 된다.] 심하면 config.sys의 files와 buffer의 설정도 따지는 게임도 있었는데, 해당 게임에 꼭 맞는 수치라기 보다는 복잡한 메모리 설정 방법 대신 게임이 돌아갈 수 있게만 시동 파일 설정을 해주는 경우에 더 가까웠다. 하지만 부팅 디스켓을 쓰면 문제가 하나 있는데, 운영 체제를 플로피 디스크에 저장하기 때문에 뭔가 할 때마다 [[플로피디스크]]를 벅벅 소리내며 긁어 댄다는 점이다.[* COMMAND.COM의 위치를 지정해 주는 SHELL을 통해 기본 셸의 위치를 하드 디스크로 설정해 놓았으면 부팅할 때 빼고는 플로피 디스크를 읽어댈 일이 없다. 물론 버전이 맞아야 한다.] MS-DOS 6.0부터는 자체에서 멀티부팅을 지원하면서 Config.sys와 Autoexec.bat에 각각의 설정을 추가해 원하는 설정으로 부팅할 수 있게 되었다.[* 이러한 이유로 그 당시 [[OS/2]]에서 사용하는 부트 매니저를 설치하는 예도 많았다. 아예 서로 다른 파티션에 서로 다른 OS를 설치하도록 만든 물건이니 OS/2를 사용하지 않더라도 복수의 파티션에 게임에 최적화된 세팅값의 MS-DOS와 Windows 95를 별도로 설치하는 것. 90년대 중반에는 여러 가지 이유로 비 MS 운영체계가 컴퓨터 잡지 등에서 크게 다뤄졌을 시대라서 OS/2에 대한 접근성이 좋았다.] 근데 이렇게 고생을 해도, 결국 게임 하다가 다른 거 하려면 심한 경우 컴퓨터를 재부팅해야 한다는 건 변하지 않는다. 그나마 EMM386 등의 메모리 관리자를 안 올렸거나 EMS를 끈 경우를 제외하면 설정만 잘 해 놓으면 보통 재부팅까지는 가지 않을 수 있었다. MS-DOS가 단순한 운영 체제라 하드 디스크로 부팅하는 경우엔 금방 재부팅할 수 있긴 했지만 귀찮기 그지 없는 상황인 것은 사실이다. MS-DOS 6.0 이후에는 기본 메모리를 너무나 열심히 확보한 나머지 프로그램이 안 돌아가는 상황도 가끔 발생했는데, 이 경우는 LOADFIX를 이용해 기본 메모리의 첫 64 KiB 영역에 올라가지 못하도록 설정해야 했다. 이렇게 기본 메모리를 확보하고 관리하는 능력은 1990년대 중반까지 컴퓨터 초보자와 중급자를 가르는 기준이었으며 각종 PC 잡지의 단골 기사거리였다. 서점에는 10여 종 이상 관련 서적이 나오기도 했다. 그리고 집에서 게임이 안 돌아간다고 학교 친구에게 메모리 잡아 달라고 부탁하는 경우도 종종 있었다. 당시 [[동급생]] 같은 일본의 [[에로게]]를 즐기던 게이머들은 설명서를 보고 따라하다가 정신을 차리고 보니 메모리 관리의 고수가 되기도 했다. 이렇게 수많은 이들을 고통에 빠트리던 640 KiB의 벽은 1995년 [[Windows 95]]가 나오면서 서서히 사라지게 된다. Windows 2.0부터 이미 보호 모드를 사용하고 있어 Windows에서는 기본 메모리 문제가 없었지만 3.1까지는 DOS 위에서 돌아가는 GUI 셸에 가까웠고 보급률이 낮아 DOS를 주로 사용하는 일반 사용자는 이를 체감하지 못했다. 게다가 Windows 3.1까지는 DOS 수준의 그래픽 속도를 제공하는 API도 없었기 때문에 게임이 거의 대부분 DOS용이기도 했다.[* 몇몇 게임은 Windows 3.1용으로 나오기는 했는데, 거의 대부분이 빠른 그래픽 속도가 필요 없는 장르에서 나왔다. [[문명 2]]의 최초 버전이 Windows 3.1용이었던 것도 빠른 그래픽 처리가 필요 없는 턴제 전략 시뮬레이션 장르였기 때문이다.] Windows 95로 PC 운영 체제의 패러다임 자체가 이동하면서 일반 유저들도 기본 메모리를 신경쓰지 않아도 되는 시대가 열렸다. 그렇지만 Windows 95는 MS-DOS 7.0을 내장하고 있었으나 이는 어디까지나 '호환용'이라서 게임을 비롯한 MS-DOS 프로그램이 제대로 돌아가지 않았다. 오작동은 흔하고 좀 까다롭다 싶은 프로그램은 그냥 <이 버전에서 사용할 수 있는 프로그램이 아닙니다>라는 메시지만 내고 튕기는 일도 잦았다. 그래서 한동안 Windows 95와 MS-DOS 6.22로 멀티부팅을 하면서 이 고통에서 헤어나지 못하는 사람들이 많았다. 그러다가 시간이 흐르면서 MS-DOS 프로그램들도 본격적으로 Windows로 옮겨가고, 이 모든 고통의 원인(?)이었던 게임 역시 [[DirectX]]의 등장과 함께[* Windows 95보다 한 발짝 늦게 나왔기 때문에 본격적으로 게임이 Windows용으로 나오기까지는 시간차가 좀 있었다.] 신작이 Windows용으로 줄줄이 나오면서 서서히 옛말이 되어 갔다. 당시의 몇몇 게임들([[워크래프트 2]], [[커맨드 앤 컨커 레드얼럿]] 등)은 MS-DOS/Windows 95용 실행 파일을 모두 제공하기도 했다. 그 뒤로 시간이 좀 더 흘러 [[NT 커널]]로 완전히 전환한 [[Windows XP]]가 나오면서 이 기본 메모리 문제는 완전히 사라지게 된다. 이제는 [[에뮬레이터]]로 MS-DOS 게임을 하려 들지 않는 이상엔 전혀 신경 쓰지 않아도 되는 문제였으나, 시간이 흐르면서 [[DOSBox]] 같은 에뮬레이터는 메모리를 알아서 잡아주기 때문에 기본 메모리 확보를 위한 피나는 투쟁은 호랑이 담배 먹던 시절의 무용담이 되었다. 하지만 그 시절 [[야겜]] 좀 해 보려다가 어느새 메모리 관리의 달인이 되었듯이, command.com, config.sys, autoexec.bat의 사용법이 몸에 배도록 강요당하면서 역시 자신들도 모르는 사이 프로그래밍 언어에 친숙해지게 되었다. 여기서 한 발 더 나가면 [[에디터#s-3.1|HEX 값을 직접 건드리는 에디터]]가 나오고, 더 나가면 [[BASIC|베이식]]에서 시작되는 프로그래밍 언어 교육이 이어진다.[* 그러나 DOSBox를 쓴다고 해서 저 3대장에서 자유로울 수는 없다. DOSBox는 메모리만 해결해 줄 뿐, 자신이 쓸 환경은 자신이 직접 짜야 하기 때문이다. 결국 그때로 되돌아가는 수밖에 없다.]저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기